學寫程式的第一個程式叫做 Hello World,那麼學習 NVIDIA Jetson Edge AI 的第一個程式呢?就叫做 Hello AI World 啦! Hello AI World 是一個由 NVIDIA 維護的專案,給要入門 NVIDIA Jetson 系列的夥伴學習使用,裡面有預訓練的 AI 模型、推論範例、訓練範例,囊括 C++ 與 Python 範例程式。 接下來幾天將使用此專案和各位一起學習!
Hello AI World (source: NVIDIA)
Hello AI World 可以運行在所有 NVIDIA Jetson 家族的邊緣運算裝置,需求的環境就是 JetPack SDK,建置的方式可以如前述使用 SDK Manager 或是 SD Card image 燒錄 (僅限 Jetson Nano Dev Kit 和 Xavier NX Dev Kit)的方式進行系統建置。如果使用 reComputer 系列出廠已經預先安裝完 JetPack 4.6 也不需要再額外安裝了。啟動 Hello AI World 有以下兩種方式:
Jetson Nano 剛推出之時只能從程式碼進行編譯,需要耗費大量的時間,且可能不小心動到系統參數或設定,就會無法順利安裝。現在可以透過 Docker 容器啟動,真的方便許多!以下將會使用 Docker 作為說明。真的有興趣想要嘗試編譯的也可以參考專案文件 Building the Project from Source。
Hello AI World 的 Docker Image 皆有放在 DockerHub 上,不同 JetPack SDK版本對應如下:
Container Tag | L4T version | JetPack version |
---|---|---|
dustynv/jetson-inference:r35.1.0 | L4T R35.1 | JetPack 5.0.2 |
dustynv/jetson-inference:r34.1.1 | L4T R34.1.1 | JetPack 5.0.1 |
dustynv/jetson-inference:r34.1.0 | L4T R34.1 | JetPack 5.0 |
dustynv/jetson-inference:r32.7.1 | L4T R32.7.1 | JetPack 4.6.1 |
dustynv/jetson-inference:r32.6.1 | L4T R32.6.1 | JetPack 4.6 |
dustynv/jetson-inference:r32.5.0 | L4T R32.5.0 | JetPack 4.5 |
如果不知道目前系統所安裝的 JetPack 版本也沒關係,執行 Docker 啟動腳本會自動找到正確的版本啟動!在終端機下輸入以下指令從 github clone 程式碼:
git clone --recursive https://github.com/dusty-nv/jetson-inference
進入專案目錄,並且執行 docker 腳本:
cd jetson-inference
docker/run.sh
第一次執行會跳出 Model Downloader 選取介面,總共有 53 個預訓練模型包含 Image Recognition, Object Detection, Mono Depth, Pose Estimation 等類型。如果不知道選什麼使用預設的選擇即可,否則也是相當花費時間與儲存空間的,後續有需要可以再透過指令進行下載,這邊直接點選 OK 進入下一步。
接下來就會看到正在下載剛剛所選擇的模型,這部分會耗費一段時間,取決於所選模型數量與網路速度而定。
最後 Docker 會把容器所需相關資料下載下來並執行,若看到終端機如下圖顯示 root@<hostname>:/jetson-inference#
就代表 Docker 已經順利運行起來囉!(已經在容器裡了!)
由於 Docker 容器在退出後即會被刪除,在容器內產生的運算結果以及相關資料也會跟著不翼而飛,因此預設腳本會使用 docker 的 volume 參數,
jetson-inference/data
(存放資料,包含預訓練模型、 測試影像資料等)jetson-inference/python/training/classification/data
(存放影像分類的訓練資料)jetson-inference/python/training/classification/models
(存放訓練好的影像分類模型)jetson-inference/python/training/detection/ssd/data
(存放物件偵測的訓練資料)jetson-inference/python/training/detection/ssd/models
(存放訓練好的物件偵測模型)如果有額外檔案系統掛載於容器需求,也可以在執行 docker 腳本時附帶參數如下方程式碼,指定所要映射的路徑(路徑必須要為絕對路徑!):
docker/run.sh --volume /my/host/path:/my/container/path
在 docker 容器中輸入以下指令,開啟 video-viewer
並指定 /dev/video0 裝置以檢視 Webcam 即時畫面,來確定容器運作正常,並且可以使用 webcam 的硬體裝置。
video-viewer /dev/video0
在 docker 容器執行 imagenet
影像分類範例程式,後續的兩個參數分別為輸入影像與輸出影像。
imagenet images/jellyfish.jpg images/test/jellyfish.jpg
完成後可以從資料夾瀏覽器開啟 ~/jetson-inference/image/test/jellyfish.jpg
來看看剛執行的推論指令其輸出的結果。如下圖顯示, 99.85% 的機率圖片中是個水母。
若要執行物件偵測則使用 detecnet
指令,預設參數同樣為輸入與輸出檔案。
detectnet images/peds_0.jpg images/test/peds_0.jpg
過程中會看到許多以 [TRT] 為開頭的 log 資訊,並且跑上好一段時間,這其實是因為第一次使用的模型被載入到 GPU 推論之前,會經過 TensorRT 的最佳化處理,來得到最好的推論效能。當第二次開始要執行該模型進行推論時,就不需要再次轉置了!而實際花費的時間可以參考最後的 summary,以此物件偵測推論為例,使用的模型為 ssd_mobilenet_v2_coco,總花費的時間為 87ms。
輸出的物件偵測結果:
當然我們也可以從 Webcam 擷取影像,當作輸入的影像來源。
detectnet /dev/video0
從 Webcam 影像進行推論的輸出結果:
現行環境建置只要透過 docker 就能快速完成,真的省下不少事!今天我們只有簡單跑幾個範例來驗證環境,接下來我們將會依序來看幾個推論範例來看看 Edge AI 可以怎麼玩, don't miss out!